#ifndef _EDBD_VSR_H_
#define _EDBD_VSR_H_

#define VSR_FOREACH_CHILD(sr, child)	\
	for (child = vsr_get_first(sr); child; child = vsr_get_next(child))

#define vsr_geti_int(dir, idx)		vsr_get_int(vsr_get_idx(dir, idx))
#define vsr_geti_ll(dir, idx)		vsr_get_ll(vsr_get_idx(dir, idx))
#define vsr_geti_dbl(dir, idx)		vsr_get_dbl(vsr_get_idx(dir, idx))
#define vsr_geti_str(dir, idx)		vsr_get_str(vsr_get_idx(dir, idx))
#define vsr_cropi_str(dir, idx)		vsr_crop_str(vsr_get_idx(dir, idx))
#define vsr_dupi_str(dir, idx)		vsr_dup_str(vsr_get_idx(dir, idx))
#define vsr_geti_oct_size(dir, idx)	vsr_get_oct_size(vsr_get_idx(dir, idx))
#define vsr_geti_oct_data(dir, idx)	vsr_get_oct_data(vsr_get_idx(dir, idx))
#define vsr_geti_bool(dir, idx)		vsr_get_bool(vsr_get_idx(dir, idx))
#define vsr_geti_ptr(dir, idx)		vsr_get_ptr(vsr_get_idx(dir, idx))
#define vsr_geti_ref(dir, idx)		vsr_get_ref(vsr_get_idx(dir, idx))

const char *vsr_get_name(const sr_t *sr);

ecm_int32 vsr_get_int(const sr_t *sr);
ecm_int64 vsr_get_ll(const sr_t *sr);
ecm_double vsr_get_dbl(const sr_t *sr);
const char *vsr_get_str(const sr_t *sr);
ecm_size_t vsr_get_oct_size(const sr_t *sr);
ecm_ptr_t vsr_get_oct_data(const sr_t *sr);
ecm_ptr_t vsr_get_ptr(const sr_t *sr);
ECMBOOL vsr_get_bool(const sr_t *sr);

int vsr_get_num_child(const sr_t *sr_group);

const sr_t *vsr_get_ref(const sr_t *sr);
sr_t *vsr_get_root(const sr_t *sr);

sr_t *vsr_get(const sr_t *sr_anchor, const sr_t *sr_LNP);
sr_t *vsr_get1(const sr_t *sr_anchor, const sr_t *sr_LNP);
sr_t *vsr_getn(const sr_t *sr_anchor, const char *LN);
sr_t *vsr_getn1(const sr_t *sr_anchor, const char *LN);
sr_t *vsr_get_parent(const sr_t *sr);
sr_t *vsr_get_child(const sr_t *sr_group, const char *name);
sr_t *vsr_get_first(const sr_t *sr_group);
sr_t *vsr_get_last(const sr_t *sr_group);
sr_t *vsr_get_next(const sr_t *sr);
sr_t *vsr_get_prev(const sr_t *sr);
sr_t *vsr_get_idx(const sr_t *sr_group, int idx);
ECMBOOL vsr_exist(const sr_t *sr_group, const char *name);
sr_val_t vsr_cpy_val(const sr_t *sr);

int vsr_cmp_val(const sr_t *sr_1, const sr_t *sr_2);
srt_t vsr_get_type(const sr_t *sr);
srt_t vsr_get_base_type(const sr_t *sr);
srt_t vsr_get_member_type(const sr_t *sr);

sr_t *vsr_dup(const sr_t *sr);

ECMBOOL vsr_is_group(const sr_t *sr);
ECMBOOL vsr_is_ref(const sr_t *sr);
ECMBOOL vsr_is_HMS(const sr_t *sr);

ECMBOOL vsr_is_compatible(const sr_t *sr, const sr_t *sr_compared);
ECMBOOL vsrt_is_member(srt_t srt_group, srt_t srt_mbr);
srt_t vsrt_is_valid_target(srt_t srt, srt_t srt_target);
srt_t vsrt_get_base_type(srt_t srt);

sr_t *vsr_let(sr_t *sr, sr_t *sr_src);
sr_t *vsr_set_val(sr_t *sr, sr_val_t val);
sr_t *vsr_set_ref(sr_t *sr, sr_t *sr_LNP);

sr_val_t vsr_get_val(const sr_t *sr);

char *vsr_get_LNP(const sr_t *sr);
sr_t *vsr_get_sr_LNP(const sr_t *sr);
ECMBOOL vsr_is_same(const sr_t *sr1, const sr_t *sr2);

ecm_ptr_t vsr_hashtable_get(const sr_t *sr, ecm_hashtable_t ht);
ECMBOOL vsr_hashtable_insert(const sr_t *sr, ecm_hashtable_t ht, ecm_ptr_t p_entry_data);
ecm_ptr_t vsr_hashtable_remove(const sr_t *sr, ecm_hashtable_t ht);

void vHMS_merge(sr_t *sr_vHMS1, sr_t *sr_vHMS2);

#endif
